package br.com.petshop.dao;

import br.com.petshop.entidades.Produto;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.List;

/**
 *
 * @author Sidney
 * @version 1.0
 * @see GenericDAO
 * Esta classe contem os metodos basicos para manipulacao do banco de dados, extende a classe GenericDAO e tem
 * como proposito manipular a tabela produtos no banco de dados.
 */
public class ProdutoDAO extends GenericDAO {

    public int adicionarProduto(Produto produto) throws SQLException {
        /**
         * pega o proximo id da tabela produto, isso permite que ao adicionar um produto seja verificado 
         * se o id ja existe.Faz com que nao seja adicionado um elemento em uma posicao ocupada.
         */
        produto.setId(getNextId("produtos"));
        String query = "INSERT INTO petshop.produtos(Id,Nome,Preco,Estoque)VALUES(?,?,?,?)";
        executeCommand(query, produto.getId(), produto.getNome(), produto.getPreco(), produto.getEstoque());
        return produto.getId();
    }
    public void removeProduto(int idProduto) throws SQLException{
        executeCommand("DELETE FROM petshop.produtos WHERE Id = ?", idProduto);
    }
    public void atualizarProduto(Produto produto) throws SQLException{
        String query = "UPDATE petshop.produtos SET Nome = ?, Preco = ?, Estoque = ? Where Id = ?";
        executeCommand(query, produto.getNome(), produto.getPreco(), produto.getEstoque(),produto.getId());
    }
    public Produto getProduto(int idProduto) throws SQLException{
        ResultSet rs = executeQuery("SELECT * FROM petshop.produtos WHERE Id = ?", idProduto);
        Produto produto = null;
        if(rs.next()){
        produto = populateProduto(rs);
        }
        rs.close();
        return produto;
        
    }

    public static Produto populateProduto(ResultSet rs) throws SQLException {
        Produto prodRetornado = new Produto();
        prodRetornado.setId(rs.getInt("Id"));
        prodRetornado.setNome(rs.getString("Nome"));
        prodRetornado.setPreco(rs.getFloat("Preco"));
        prodRetornado.setEstoque(rs.getInt("Estoque"));
        return prodRetornado;
    }
    
    /**
     * Este metodo retorna um List com todos os produtos cadastrados adicionando a lista
     * os produtos com uma chamada ao metodo estatico populateProduto
     * @return
     * @throws SQLException 
     */
    public List<Produto> getAllProducts() throws SQLException{
        List <Produto> prodRetornados = new LinkedList<Produto>();
        ResultSet rs = executeQuery("SELECT * FROM petshop.produtos");
        while(rs.next()){
            prodRetornados.add(populateProduto(rs));            
        }
        return prodRetornados;
    }
}
